'''
* This is the projet for Brtc LlmOps Platform
* @Author Leon-liao <liaosiliang@alltman.com>
* @Description //TODO 
* @File: 1_study_achieve_lecl_by_self.py
* @Time: 2025/7/13
* @All Rights Reserve By Brtc
'''
import dotenv
from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
""" 
# 自己简单实现一个链
# 传统做法
#paraser.invoke(llm.invoke(prompt.invoke({"query":"你好请讲一个关于程序员的冷笑话"})))
分析: 
1、每个 对象都有一个invoke 的 方法
2、上一个对象的 输出是下一个对象的输入
3、能否用一个列表来装所有的步骤,一步一步调用公共的invoke 方法去执行,直到所有的步骤全不完成
"""
class Chain:
    m_steps: list=[]
    def __init__(self, steps: list):
        self.m_steps = steps

    def invoke(self, input):
        for one_step in self.m_steps:
            input = one_step.invoke(input)
            print("步骤:", one_step)
            print("输出:", input)
            print("========================================")
dotenv.load_dotenv()
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model = "gpt-3.5-turbo-16k")
paraser = StrOutputParser()
#我们跟 大语言模型交互 总共分  3步， 第一步  是 构建提示词   第二部 是 创建 大模型   第三步是  构建解析器
test_chain = Chain([prompt, llm, paraser])
test_chain.invoke({"query":"你好，你是谁？"})